iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 24

被MongoDB用Index暴打的後端小菜雞日記-day 24- index使用懶人包

  • 分享至 

  • xImage
  •  

昨天講解index的資料結構,今天我們要來講解index相關的設定,我們應該選擇哪些欄位,建立索引,以及不同的索類型。

在建立索引之前,首先必須決定好我們要建立哪一個欄位的索引,比如說我們現在有許多筆商品資料,資料結構如下。

{ _id: 1, name: "滑鼠", price: 600, amount: 10 }

在建立collection的當下,MongoDB本身就會自動幫我們建立_id的索引,預設會使用Unique Indexes,Unique Indexes會確保索引欄位沒有重複的值出現,意思是不會有兩筆資料的_id是一樣的。

因此在我們沒有主動建立索引的情況下,並且資料數量十分龐大的情況下,我們單獨使用_id來搜尋條件,會比使用 name、price、amount搜尋還要快。

但一般來說除非是前端要顯示特定商品的頁面,傳給後端商品_id值,讓後端回傳商品的詳細資料,大多數情況都是針對特定欄位給予條件進行搜尋。

比如說消費者很常使用商品的價格進行搜尋,這時候就可以針對price加上索引,建立的語法如下。

db.product.createIndex( { price: 1 } )

基本上就是在createIndex帶入一個物件,寫入你要建立index的欄位,在用 1 或是 -1決定資料的排序方向,如果是1就會按照商品價格,由小到大排序資料, -1 則是由大到小排序資料。

索引成功建立後,我們利用商品價格搜尋資料,就會命中到price_1這個索引,進而加快搜尋的速度,但是如果我們是使用商品名稱來搜尋,就不會命中到任何索引。

因此在建立索引時,必須先想好常用的搜尋場景,會使用到哪些欄位做為搜尋條件,才能建立最合適的索引。

ps. 目前示範只包含一個欄位的索引,被稱為Single Field Indexes,欄位的順序其實不太重要,填寫1 或是 -1不會有太大的差別,而明天會介紹到的Compound Index,可以包含許多欄位,這時候欄位的先後順序,以及資料排序就會影響到搜尋的效率了。

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Index暴打的後端小菜雞日記-day23- 什麼是index?
下一篇
被MongoDB用Index暴打的後端小菜雞日記-day25-建立index的順序 (ESR rule)
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言